Javascript Traps

javascript 陷阱集

考作用域

1
2
3
4
5
6
7
(function() {
var b = 5;
var a = b;
b = 6;
console.log(a,b);
//5 6
})();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var g = 0;
function f() {
    // 这里面就形成了一个方法作用域, 能够保护其中的变量不能被外部访问
    // 方法作用域能够访问全局作用域
    var a = 1;
    console.log(g);
    // 嵌套方法作用域
    function ff() {
        // 这里面再度形成了一个方法作用域
        // 其中可以访问外部的那个方法作用域
        var aa = 2;
        console.log(a);
    }
    // 出了 ff 的作用域就不能访问其中的东西了
    // console.log(aa); // 报错 ReferenceError: aa is not defined
}
f();
// console.log(a); // 报错 ReferenceError: a is not defined

考声明提前

1
2
3
4
5
6
7
8
9
10
11
//考声明提前
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();

考 this

1
2
3
4
5
6
7
8
9
10
11
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
getFullname: function() {
return this.fullname;
}
};
console.log(obj.getFullname()); //Colin Ihrig
var test = obj.getFullname; //John Doe
console.log(test());

制造干扰因素的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
},
getFullname: function() {
return this.fullname;
}
};
console.log(obj.prop.getFullname()); //Aurelio De Rosa
console.log(obj.getFullname()); //Colin Ihrig
var test = obj.prop.getFullname; //John Doe
console.log(test());

分号陷阱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//分号陷阱
function fn(){
return {
x:1
};
} //{x:1}
function fn(){
return
{
x:1
};
}
console.log(fn()) //undefined

小数相加

1
2
3
4
//不要相信js的符点运算结果,但是整数是可依赖的
0.1 + 0.2 不等于 0.3 //0.30000000000000004
可用如下
(0.1*10 + 0.2*10)/10